package com.aloda.utils;

import com.aloda.exception.BaseException;
import org.springframework.web.multipart.MultipartFile;


import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * 文件格式检查工具类
 * @author aloda
 */
public class FileCheckUtils {
    private static final long MAX_FILE_SIZE = 2 * 1024 * 1024;
    private static final List<String> ALLOWED_FILE_TYPES = Arrays.asList("jpg", "png");


    /**
     * 检查文件是否符合要求
     * @param file 要检查的文件
     * @return 如果文件符合要求返回 true，否则返回 false
     */
    public static boolean checkFile(MultipartFile file) {
        if (file == null) {
            return false;
        }
        // 检查文件大小
        if (file.getSize() > MAX_FILE_SIZE) {
            return false;
        }
        // 检查文件类型
        String originalFilename = file.getOriginalFilename();
        if (originalFilename == null) {
            return false;
        }
        String fileExtension = getFileExtension(originalFilename);
        return ALLOWED_FILE_TYPES.contains(fileExtension);
    }

    /**
     * 检查应用封面图片格式是否符合要求
     * @param file 封面图片文件
     * @return true-符合 false-不符合
     */
    public static boolean checkAppCoverImgFile(MultipartFile file) {
        try {
            // 首先使用通用的文件检查方法进行初步检查
            if (!checkFile(file)) {
                return false;
            }

            // 将文件转换为字节数组并尝试读取为BufferedImage对象
            byte[] bytes = file.getBytes();
            BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes));
            if (image == null) {
                return false; // 如果无法读取为图像，则返回false
            }

            int width = image.getWidth();
            int height = image.getHeight();

            // 检查分辨率是否超过2048x2048像素
            if (width > 2048 || height > 2048) {
                return false; // 分辨率超出限制
            }

            // 检查长宽比是否在3:2或2:3以内
            double aspectRatio = (double) width / height;
            if (aspectRatio > 1.5 || aspectRatio < 0.6667) { // 长宽比不在3:2或2:3范围内
                return false;
            }
            return true; // 所有检查通过
        } catch (IOException e) {
            throw new BaseException(e.getMessage());
        }
    }


    /**
     * 获取文件的扩展名
     * @param originalFilename 原始文件名
     * @return 文件的扩展名
     */
    private static String getFileExtension(String originalFilename) {
        int lastIndex = originalFilename.lastIndexOf(".");
        if (lastIndex == -1) {
            return "";
        }
        return originalFilename.substring(lastIndex + 1).toLowerCase();
    }
}
